#include <stdio.h>
#include <stdarg.h>

void minprintf(char *fmt, ...)
{
  va_list ap;  /* points to each unnamed arg in turn */
  char *p, *sval;
  int ival;
  double dval;

  va_start(ap, fmt);  /* make ap point to 1st unnamed arg */
  for (p = fmt; *p; p++) {
    if (*p != '%') {
      putchar(*p);
      continue;
    }
    switch (*++p) {
      case 'd':
        /* each call of va_arg returns one argument and steps ap to the next */
        ival = va_arg(ap, int);
        printf("%d", ival);
        break;
      case 'f':
        dval = va_arg(ap, double);
        printf("%f", dval);
        break;
      case 's':
        for (sval = va_arg(ap, char*); *sval; sval++)
          putchar(*sval);
        break;
      default:
        putchar(*p);
        break;
    }
  }
  va_end(ap);  /* clean up when done */
}

int main(int argc, char *argv[])
{
  minprintf("%d: oo , %s , %f\n", 1, " :) ", 12.14);
  return 0;
}
